
package edu.uoc.tdp.bbdd;

import edu.uoc.tdp.common.EOlympicsException;
import edu.uoc.tdp.common.TDSLanguageUtils;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
import javax.swing.JOptionPane;

/**
 *  Classe que gestiona la connexió i desconnexió a la base de dades.
 *  @version  1.0a; 12-6-2001; java version "1.2.2";
 *  @autor TDP
 */
public class GestorDiscConnexio
{
  
  /** Prepara la connexió. */
  private Connection connexio = null;
  private Statement sentencia = null;
  
 /** Mètode sense paràmetres que crea la connexió a la base de dades.
  *  {pre:la base de dades està correctament instal.lada.}
  *  {post:crea una connexió a la base de dades.}
  */
  public void obreConnexioBD()
  {
    try
    {
      Class.forName("org.postgresql.Driver");
        Properties props = new Properties();
        URL url = ClassLoader.getSystemResource("edu/uoc/tdp/properties/configuration.properties");
        props.load(url.openStream());      
        connexio = DriverManager.getConnection(props.getProperty("url"),
                props.getProperty("username"),props.getProperty("password"));
    }
    catch (SQLException sqle)
    {
    	JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO"), "Error", JOptionPane.ERROR_MESSAGE); 
    }
    catch (Exception e)
    {
    	JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO_DESC"),"Error",JOptionPane.ERROR_MESSAGE); 
    }
  }
  
  
 /** Mètode sense paràmetres que crea una sentencia per manipular la base de dades.
  *  {pre: existeix una connexio a la base de dades.}
  *  {post: crea una sentencia que manipular� la base de dades.}
  *  @return Statement - la sentencia creada.
  */
  public Statement creaSentencia()
  {
    try
    {
      sentencia = connexio.createStatement();
    }
    catch (SQLException sqle)
    {
    	JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO"), "Error", JOptionPane.ERROR_MESSAGE);
    }
    catch (Exception e)
    {    
        JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO_DESC"), "Error", JOptionPane.ERROR_MESSAGE);
    }
    return sentencia;
  }
    /** Mètode que crea un Prepared Statement per a manipular la BD
     * {pre: hi ha una connexió amb la BD.}
     * {post: crea una sentència que manipulara la BD.}
     * @return PreparedStatement - la sentència creada.
     * @exception EOlympicsException
     */
    public PreparedStatement crearPreparedStatement(String ps) throws EOlympicsException {
        try {
            return connexio.prepareStatement(ps, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_CONEXIO);
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new EOlympicsException(EOlympicsException.ERR_CONEXIO_DESC);
        }
    }

  
 /** Mètode sense paràmetres que obté la sentencia en curs.
  *  {pre: existeix una connexio a una base de dades}
  *	 {post: obté la sentencia.}
  *  @return Statement - la sentència actual.
  */
  public Statement getSentencia()
  {
    return sentencia;
  }
  
 /** Mètode amb un paràmetre que assigna una sentencia.
  *  {pre: existeix una connexio a una base de dades}
  *	 {post: ha assignat la sentència.}
  */
  public void setSentencia(Statement pSentencia)
  {
    sentencia = pSentencia;
  }
  
 /** Mètode sense paràmetres que tanca la sentencia en curs.
  *  {pre: existeix una connexio a una base de dades}
  *	 {post: ha tancat la sentencia.}
  */
  public void tancaSentencia()
  {
     try
    {
      sentencia.close(); //tanca la sentència
    }
     catch (SQLException sqle)
    {
        JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO"), "Error", JOptionPane.ERROR_MESSAGE);
    }
    catch (Exception e)
    {
    	JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO_DESC"), "Error", JOptionPane.ERROR_MESSAGE);
    }
  }
  

 /** Mètode sense paràmetres que provoca la desconnexió de la base de dades.
  *  {pre: existeix una connexió a una base de dades}
  *	 {post: ha desconnectat l'aplicació de la base de dades.}
  */
  public void tancaConnexioBD()
  {
    try
    {
      connexio.close(); //tanca la connexió
    }
      catch (SQLException sqle)
    {
        JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO"), "Error", JOptionPane.ERROR_MESSAGE);
    }
    catch (Exception e)
    {
        JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("ERR_CONEXIO_DESC"), "Error", JOptionPane.ERROR_MESSAGE);        
    }
  }
  
  
  
 /** Mètode sense paràmetres que obté la connexio actual a la base de dades.
  *  {pre: existeix una connexio a una base de dades}
  *	 {post: obté la connexio.}
  *  @return Connection - la connexio a la base de dades.
  */
  public Connection getConnexio()
  {
  	return connexio;
	}
	
	
/** Mètode amb un paràmetre que assigna la connexio actual a la base de dades.
  *  {pre: la base de dades està correctament configurada}
  *  {post: ha assignat la connexió.}
  */
  public void setConnexio(Connection pConnexio)
  {
  	connexio = pConnexio;
	}

}
